
package highvoltage;

import java.util.List;

import highvoltage.skeletonHelpers.*;

/**
 * Jármûvet reprezentáló absztrakt osztály. Belõle származik a civil, a rendõr
 * és a bankrabló is.
 * 
 * @author Tomi
 * @version 1.0
 * @created 16-márc.-2010 21:08:07
 */
public abstract class Vehicle implements IRuleVisitor, IVehicleVisitor
{

	/**
	 * A jármû alapértelmezett alapsúlya. Ennek és a szabályok által visszaadott
	 * faktoroknak segítségével számítható a forgalmi súly.
	 */
	private float _baseWeight;
	/**
	 * Erre áll vissza 0-ról, vagy ha már nincs lassítási kényszere.
	 */
	protected float _defaultSpeed;
	/**
	 * A jármû aktuális sebessége (Segment/Tick mértékegységben)
	 */
	protected float _speed;
	/**
	 * Amikor a jármû irányváltoztatási helyzetbe kerül, a döntési stratégia
	 * osztály dönti el, hogy melyik legyen a következõ irány, amerre halad.
	 */
	protected Strategy _strategy;
	/**
	 * Számított aktuális súly.
	 */
	protected float _weight;
	/**
	 * A jármûvet tartalmazó csomagoló referenciája.
	 */
	protected VehicleWrapper _wrapper;

	public Vehicle()
	{

	}

	/**
	 * Jármû Visitor minta szerinti accept metódusa. Alkalmazzuk a szabályok
	 * értékelésénél és az ütközéseknél.
	 * 
	 * @param visitor
	 *            Egy IRuleVisitor interfészt megvalósító objektum.
	 */
	public void accept( IVehicleVisitor visitor )
	{	
		Logger.print( "Vehicle::accept(IVehicleVisitor visitor)", this );
		Logger.ret();
	}

	/**
	 * A paraméterül kapott entryWeight fényében a stratégiájának megfelelõen
	 * megváltoztatja a viselkedését. Ha továbbmegy a jármû, akkor a
	 * visszatérési érték <b>true</b>.
	 * 
	 * @param weight
	 *            A belépéshez szükséges súly.
	 */
	public boolean checkEntryWeight( float weight )
	{
		Logger.print( "Vehicle::checkEntryWeight(weight)", this );
		Logger.ret();

		return false;
	}

	/**
	 * Ezen a metóduson keresztül kerül felszólításra a jármû arra, hogy
	 * válasszon haladási irányt.
	 * 
	 * @param directions
	 */
	public float chooseAngle( List<Float> directions )
	{
		Logger.print( "Vehicle::chooseAngle(directions)", this );

		Logger.call( "Strategy::decide" );
		_strategy.decide( directions );

		Logger.ret();

		return 0.0f;
	}

	/**
	 * A jármû aktuális haladási sebessége (Ticks/Sec), hogy az RS össze tudja
	 * állítani a szíbálylistát.
	 */
	public float getSpeed()
	{
		Logger.print( "Vehicle::getSpeed()", this );
		Logger.ret();

		return 0.0f;
	}

	/**
	 * A jármû eltávolítására való metódus. Értesíti a csomagolóját, hogy
	 * szüntesse meg a rá mutató referenciát.
	 */
	public void kill()
	{
		Logger.print( "Vehicle::kill()", this );

		Logger.call( "VehicleWrapper::kill()", _wrapper );
		_wrapper.kill();

		Logger.ret();
	}

	/**
	 * Beállítja a jármű csomagolóját.
	 * 
	 * @param wrapper A jármű csomagolója.
	 */
	public void setWrapper( VehicleWrapper wrapper )
	{
		Logger.print( String.format( "Vehicle::setWrapper( wrapper | %d )", wrapper.hashCode() ), this );

		_wrapper = wrapper;

		Logger.ret();
	}

	/**
	 * Szabály objektum feldolgozása.
	 * 
	 * @param rule
	 *            SpeedLimit típusú Rule.
	 */
	public void visitRule( SpeedLimit rule )
	{
		Logger.print( "Vehicle::visitRule(SpeedLimit rule)", this );
		Logger.ret();
	}

	/**
	 * Szabály objektum feldolgozása.
	 * 
	 * @param rule
	 *            Traffic típusú Rule.
	 */
	public void visitRule( TrafficLight rule )
	{
		Logger.print( "Vehicle::visitRule(TrafficLight rule)", this );
		Logger.ret();
	}

	/**
	 * Szabály objektum feldolgozása.
	 * 
	 * @param rule
	 *            StopSign típusú Rule.
	 */
	public void visitRule( StopSign rule )
	{
		Logger.print( "Vehicle::visitRule(StopSign rule)", this );
		Logger.ret();
	}

	/**
	 * Az ütközõ jármû típusától függõ események elindítása.
	 * 
	 * @param vehicle
	 *            Police típusú jármû.
	 */
	public void visitVehicle( Police vehicle )
	{
		Logger.print( "Vehicle::visitVehicle(Police vehicle)", this );
		Logger.ret();
	}

	/**
	 * Az ütközõ jármû típusától függõ események elindítása.
	 * 
	 * @param vehicle
	 *            Civilian típusú jármû.
	 */
	public void visitVehicle( Civilian vehicle )
	{
		Logger.print( "Vehicle::visitVehicle(Civilian vehicle)", this );
		Logger.ret();
	}

	/**
	 * Az ütközõ jármû típusától függõ események elindítása.
	 * 
	 * @param vehicle
	 *            Robber típusú jármû.
	 */
	public void visitVehicle( Robber vehicle )
	{
		Logger.print( "Vehicle::visitVehicle(Robber vehicle)", this );
		Logger.ret();
	}

}
